<?php
/**
 +------------------------------------------------------------------------------
 * Mysql实现类
 +------------------------------------------------------------------------------
 */
class Mysql
{
    
   	// 当前连接ID
    private $_linkID    = false;
    
    // Mysql的query对象
    private $_QUERY     = false;

	/**
     +----------------------------------------------------------
     * 创建数据库连接
     +----------------------------------------------------------
     */
    protected function _connect()
    {
    	// 取得数据库连接配置
    	$params = INI('db');
    	
    	// 判断mysql扩展是否存在
    	if (!extension_loaded('mysql')) {
            IException::set('无法找到mysql扩展！ ',__FILE__,__LINE__);
        }

        // 取得数据库连接类型
        $persistent = ($params['persistent']) ? 'mysql_pconnect' : 'mysql_connect';

        // 连接数据库
        $connection = @$persistent($params['host'].':'.$params['port'],$params['user'],$params['passwd']);
        if (!$connection){
        	IException::set('数据库连接失败！ ',__FILE__,__LINE__);
        }

        // 判断连接的有效性
        if (is_resource($connection) && mysql_select_db($params['database'], $connection)) {
            $this->_linkID = $connection;
            $this->query("SET NAMES utf8");
            $this->query('SET time_zone +8.0');
            return $this->_linkID;
        }
    }
    
	/**
     +----------------------------------------------------------
     * 发送一条MySQL查询
     +----------------------------------------------------------
     */
    protected function query($sql)
    {
    	$this->_QUERY = mysql_query($sql, $this->_linkID);
        return $this->_QUERY;
    }
    
    /**
     +----------------------------------------------------------
     * 取得前一次 MySQL 操作所影响的记录行数
     +----------------------------------------------------------
     */
	protected function affectedRows()
    {
        return mysql_affected_rows($this->_linkID);
    }

    /**
     +----------------------------------------------------------
     * 取得记录集中第一条记录
     +----------------------------------------------------------
     */
	protected function fetch($type = 'ASS')
    {
    	// 判断取得记录集的方式
        switch (strtoupper($type)) {
        	// 从结果集中取得一行作为关联数组
            case 'ASS':
                $func = 'mysql_fetch_assoc';
                break;
            // 从结果集中取得一行作为关联数组，或数字数组，或二者兼有
            case 'NUM':
                $func = 'mysql_fetch_array';
                break;
            // 从结果集中取得一行作为对象
            case 'OBJ':
                $func = 'mysql_fetch_object';
                break;
            default:
                $func = 'mysql_fetch_assoc';
        }

        // 返回记录集第一条记录
        return $func($this->_QUERY);
    }

    /**
     +----------------------------------------------------------
     * 取得记录集的集合
     +----------------------------------------------------------
     */
	protected function fetchAll($type = 'ASS')
    {
    	// 判断取得记录集的方式
        switch (strtoupper($type)) {
        	// 从结果集中取得一行作为关联数组
            case 'ASS':
                $func = 'mysql_fetch_assoc';
                break;
            // 从结果集中取得一行作为关联数组，或数字数组，或二者兼有
            case 'NUM':
                $func = 'mysql_fetch_array';
                break;
            // 从结果集中取得一行作为对象
            case 'OBJ':
                $func = 'mysql_fetch_object';
                break;
            default:
                $func = 'mysql_fetch_assoc';
        }
        
        // 初期化记录集的集合
        $result = array();
        
        // 给记录集的集合赋值
        while ($row = $func($this->_QUERY)) {
            $result[] = $row;
        }
        
        // 释放记录集占用的内存
        mysql_free_result($this->_QUERY);
        return $result;
    }
    
    /**
     +----------------------------------------------------------
     * 取得插入记录ID
     +----------------------------------------------------------
     */
	protected function lastInsertId()
    {
        return mysql_insert_id($this->_linkID);
    }
    /**
     +----------------------------------------------------------
     * 开启数据库事务
     +----------------------------------------------------------
     */
	protected function beginTransaction()
    {
        mysql_query('START TRANSACTION', $this->_linkID);
    }
    
    /**
     +----------------------------------------------------------
     * 数据提交
     +----------------------------------------------------------
     */
    protected function commit()
    {
        if ($result = mysql_query('COMMIT', $this->_linkID)) {
            return true;
        }
    }
    
    /**
     +----------------------------------------------------------
     * 数据回滚
     +----------------------------------------------------------
     */
    protected function rollBack()
    {
        if ($result = mysql_query('ROLLBACK', $this->_linkID)) {
            return true;
        }
    }
    
    /**
     +----------------------------------------------------------
     * 转义一个字符串用于 mysql_query ,并不转义 % 和 _。 
     +----------------------------------------------------------
     */
	protected function escape($str)
    {
        return mysql_escape_string($str);
    }
    
	/**
     +----------------------------------------------------------
     * 关闭连接
     +----------------------------------------------------------
     */
	protected function close()
    {
        if (is_resource($this->_linkID)) {
            mysql_close($this->_linkID);
        }
    }
    
	/**
     +----------------------------------------------------------
     * 是否记录集
     +----------------------------------------------------------
     */
	protected function free()
    {
        mysql_free_result($this->_query);
    }
    
    /**
     +----------------------------------------------------------
     * 取得错误信息
     +----------------------------------------------------------
     */
	protected function error($type = 'STRING')
    {
    	// 判断取得错误信息的方式
        if (is_resource($this->_linkID)) {
            $errno = mysql_errno($this->_linkID);
            $error = mysql_error($this->_linkID);
        } else {
            $errno = mysql_errno();
            $error = mysql_error();
        }
		
        // 判断是否有错误信息
        if ($errno == 0){
        	return false;
        }
        
        // 判断返回信息格式
    	if ('ARRAY' == strtoupper($type)) {
    		
    		// 放回错误信息数组
            return array('code' => $errno, 'msg' => $error);
        }

        // 放回错误信息字符串
        return $errno . ':' . $error;
    }
}
?>